/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tools;

import core.bd;
import java.awt.Component;
import java.awt.Container;
import java.io.*;
import java.security.MessageDigest;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComboBox;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import org.jdesktop.swingx.JXErrorPane;
import org.jdesktop.swingx.error.ErrorInfo;

/**
 *
 * @author Administrador
 */
public class Util {

    PreparedStatement pt = null;
    ResultSet rsQuery = null;
    //Cantidad de Registros retornados por un SELECT
    private int cantRegistros;

    public String ed_getClaveProperties(String ed_ruta, String ed_clave) {
        Properties ed_properties = new Properties();
        InputStream ed_is = null;
        //String ed_rutaFinal = this.getClass().getResource( ed_ruta ).toString().replace( "%20", " " ).substring(6).replace( "/", new File( ed_ruta ).separatorChar + "" );
        //i( "RUTA: " + ed_rutaFinal );
        try {
            //ed_is = new FileInputStream( ed_rutaFinal );
            ed_properties.load(this.getClass().getResourceAsStream(ed_ruta));

        } catch (IOException a) {

            System.out.println(a.getMessage()); //mm

        }
//      Recorre todas las clave del archivo .properties asociado
//        for (Enumeration e = prop.keys(); e.hasMoreElements();) {
//            // Obtenemos el objeto
//            Object obj = e.nextElement();
//            System.out.println(obj + " : " + prop.getProperty(obj.toString()));
//        }
        String ed_valor = ed_properties.getProperty(ed_clave);
        return ed_valor;

    }

    public String ed_proper(String ed_tipo, String ed_clave, String ed_paquete) {

        String ed_ruta = (ed_paquete == null ? "/Internacionalizacion/" : "/" + ed_paquete + "/") + (ed_paquete == null ? ed_getClaveProperties("/Core/Core.properties", "idioma") + "/" : "") + ed_tipo + ".properties";
        String ed_valor = ed_getClaveProperties(ed_ruta, ed_clave);
        return ed_valor;

    }

    public static void i(String ed_object) {
        System.out.println(ed_object);
    }

    public static void e(String ed_object) {
        System.err.println(ed_object);
    }

    /**
     * <p><strong>encryptMD5</strong></p> Encripta un String que recibe como
     * parametro utilizando el Algoritmo MD5 (Message-Digest Algorithm 5,
     * Algoritmo de Resumen del Mensaje 5).
     *
     * @param code String que será Encriptado
     * @return code String Encriptado
     */
    public static String encryptMD5(String code) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] input = code.getBytes(); //"UTF8");
            input = md.digest(input);
            code = toHexadecimal(input); //new String(input,"UTF8");

            return code;
        } catch (Exception e) {

            return code;
        }

    }

    private static String toHexadecimal(byte[] datos) {
        String resultado = "";
        ByteArrayInputStream input = new ByteArrayInputStream(datos);
        String cadAux;
        boolean ult0 = false;
        int leido = input.read();
        while (leido != -1) {
            cadAux = Integer.toHexString(leido);
            if (cadAux.length() < 2) { //Hay que añadir un 0
                resultado += "0";
                if (cadAux.length() == 0) {
                    ult0 = true;
                }
            } else {
                ult0 = false;
            }
            resultado += cadAux;
            leido = input.read();
        }
        if (ult0)//quitamos el 0 si es un caracter aislado
        {
            resultado =
                    resultado.substring(0, resultado.length() - 2) + resultado.charAt(resultado.length() - 1);
        }
        return resultado;
    }

    /**
     * Esta funcion retorna el name del RadioButton Seleccionado dentro de un
     * ButtonGroup. El name para este caso sera el nombre del campo de la Base
     * de Datos.
     *
     * @param group ButtonGroup al cual se le comprobara cual sera el elemento
     * seleccionado.
     * @return name del Radio Seleccionado. / Null si no tiene nombre.
     */
    public static String valorRadioButton(javax.swing.ButtonGroup group) {
        for (java.util.Enumeration e = group.getElements(); e.hasMoreElements();) {
            javax.swing.JRadioButton b = (javax.swing.JRadioButton) e.nextElement();
            if (b.getModel() == group.getSelection()) {
                return b.getName();
            }
        }
        return null;
    }

    /**
     *
     * @param ed_campoBD
     * @param ed_condicionador
     * @param ed_tipoCondicionador Si el campo en la Base de datos en Varchar 1
     * / Si campo en BD es Numeric 2
     * @return
     */
    public static String ed_condicionBusqueda(String ed_campoBD, String ed_condicionador, int ed_tipoCondicionador) {
        String ed_whereCondicionada = (ed_tipoCondicionador == 1) ? ed_campoBD + " LIKE('%" + ed_condicionador + "%')" : ed_campoBD + " = '" + ed_condicionador + "'";
        return ed_whereCondicionada;
    }

    public static ArrayList StringtoList(String stg, String separator) {
        ArrayList conver = new ArrayList();

        String[] array = stg.split(separator);

        System.out.println("String  " + array.length);

        if (array.length > 0) {
            for (int i = 0; i < array.length; i++) {
                conver.add(array[i]);
            }
        }

        return conver;
    }

    // puede usar la misma sql para pasarla a sqlDatos...
    public int cant(String sql) {
        int c = 0;
        this.pt = null;
        this.rsQuery = null;
        try {
            pt = bd.getConexion().prepareStatement(sql);
            rsQuery = pt.executeQuery();
            while (rsQuery.next()) {
                c++;
            }


        } catch (SQLException e) {
            this.i("Error: Util: " + e.getMessage());
        }
        return c;
    }

    public boolean sqlEjec(String sql) {
        this.pt = null;
        boolean estado = false;
        try {
            System.out.println("sql ejecutada = " + sql);
            pt = bd.getConexion().prepareStatement(sql);
            pt.execute();
            pt = null;
            estado = true;
        } catch (SQLException e) {
            //this.i("Error: Util: " + e.toString() );
            System.out.println("e = " + e);
            estado = false;


        } catch (Exception e) {
            System.out.println("e = " + e);
        }
        return estado;
    }
    
        public boolean sqlEjecM(String sql) {
        try {
            bd.getConexion().setAutoCommit(true);
        } catch (SQLException ex) {
            ErrorInfo ed_infoError = new ErrorInfo("Error", "Error Agregando Auto Commit en Transaccion", null, "category", ex,
                    Level.CONFIG, null);
            JXErrorPane.showDialog(null, ed_infoError);
        }
        this.pt = null;
        boolean estado = false;
        try {
            pt = bd.getConexion().prepareStatement(sql);
            pt.execute();
            estado = true;
        } catch (SQLException e) {
            ErrorInfo ed_infoError = new ErrorInfo("Error", "Problemas Realizando envio de Información a la Base de Datos", null, "category", e,
                    Level.CONFIG, null);
            JXErrorPane.showDialog(null, ed_infoError);
            estado = false;
        }
        return estado;
    }

    public int count(String sql) {
        int c = 0;
        this.pt = null;
        this.rsQuery = null;
        try {
            pt = bd.getConexion().prepareStatement(sql);
            rsQuery = pt.executeQuery();
            rsQuery.next();
            c = rsQuery.getInt(1);

        } catch (SQLException e) {
            System.out.println("Error SQL (count()) e = " + e);
            c = -1;
        }
        return c;
    }

    /**
     * Ejecuta una Query
     *
     * @param sql
     * @return un Objecto bidimencional con el resultado de la Consulta
     */
    public Object[][] sqlDatos(String sql) {

        Object[][] datos = null;
        this.pt = null;
        this.rsQuery = null;
        try {

            pt = bd.getConexion().prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
            rsQuery = pt.executeQuery();

            //Enviamos Curso al Final para conocer numro de Filas
            rsQuery.last();
            int nFilas = rsQuery.getRow();


            //Enviamos el Curso al Principio
            rsQuery.beforeFirst();

            int nColum = rsQuery.getMetaData().getColumnCount();

            datos = new Object[nFilas][nColum];
            //System.out.println("nFilas = " + nFilas + " | Columnas = " + nColum);
            int fil = 0;
            while (rsQuery.next()) {
                for (int colum = 0; colum < nColum; colum++) {
                    //System.out.println("rsQuery.getMetaData().getColumnClassName(colum) = " + rsQuery.getMetaData().getColumnClassName(colum + 1));
                    datos[ fil][ colum] = rsQuery.getString(colum + 1);
                }
                fil++;
            }
            setCantRegistros(nFilas);

        } catch (SQLException e) {
            this.i("SQLException: Util.java (selectSQL) = " + e.getMessage());
        }

        return datos;
    }

    /**
     * Retorna el Numero de Registros de la ejecucion SQL que ha retornado la
     * ejecucion de una consula<br>
     *
     * @return Numero de Filas de una Consulta SQL
     */
    public int getCantRegistros() {
        return cantRegistros;
    }

    public void setCantRegistros(int cantRegistros) {
        this.cantRegistros = cantRegistros;
    }

    /*
     * Retorna la Fecha en Formato dd - MM - AAAA
     */
    public String fechaToString(Date fechaO) {
        return fechaToString(fechaO, false);
    }

    /*
     * Retorna la Fecha en Formato dd - MM - AAAA
     */
    public String fechaToString(Date fechaO, boolean isSQL) {
        String fecha = null;
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            fecha = format.format(fechaO);
            return (isSQL) ? String.format("'%s'", fecha) : fecha;
        } catch (Exception ex) {
            System.out.println("(Exception) ex = " + ex);
            fecha = "null";
        }
        return fecha;
    }

    public Date sqlDateToUtilDate(long l) {

        java.sql.Date f = new java.sql.Date(l);
        java.util.Date utilDate = new java.util.Date(f.getTime());

        return utilDate;
    }

    public Date stringToDate(String txt) {
        Date fecha = null;

        if (!txt.isEmpty()) {
            SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");
            //String strFecha = "1950-12-15 00:00:00";
            System.out.println("FECHA RECIBIDA txt = " + txt);

            try {
                fecha = formatoDelTexto.parse(txt);

            } catch (ParseException ex) {
                Logger.getLogger(Util.class.getName()).log(Level.SEVERE, "ParseException {0}", ex);
                fecha = new Date(); //Si falla , retornar fecha actual
            }
        }

        return fecha;
    }

    /**
     * Limpiar Campos de Formulario
     *
     * @param component
     */
    public static void limpiarCamposForm(Component component) {
        if (component instanceof JTextField) {
            JTextField text = (JTextField) component;
            text.setText("");
        } else if (component instanceof JComboBox) {
            JComboBox combo = (JComboBox) component;
            combo.setSelectedIndex(0);
        }  
        else {
            if (component instanceof Container) {
                for (Component c : ((Container) component).getComponents()) {
                    limpiarCamposForm(c);
                }
            }


        }
    }
    
    public static Timestamp dateToTimestamp(Date date){
        Timestamp fechaSQL  = null;
        if (date != null){
            fechaSQL = new Timestamp(date.getTime());
        }else{
            fechaSQL = new Timestamp(System.currentTimeMillis());
            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, "Fecha Recibida como parametro nula, se enviara fecha actual.");
        }
        return fechaSQL;
    }
}
